const { ADDRGETNETWORKPARAMS, promises } = require("dns");
const { name } = require("ejs");
const express = require("express")
const path = require('path');
const app = express()
const fs = require("fs/promises")
// 设置为一个数组模拟数据库.......
const Users = require("./date/students.json")

// 进入模组,并且设置好ejs模组,同时默认路劲
// 第一个是名字
app.set("view engine", "ejs")
app.set("views", path.resolve(__dirname, "views"))
// 设置静态路劲
app.use(express.static(path.resolve(__dirname, "public")))
// 设置解析中间件
app.use(express.urlencoded())

app.get("/", (req, res) => {
})
app.get("/students", (req, res) => {
    /* 
    希望用户在访问students路由时，可以给用户返回一个显示有学生信息的页面
        html页面属于静态页面，创建的时候什么样子，用户看到的就是什么样子
        不会自动跟随服务器中数据的变化而变化

    希望有这么一个东西，他呢长的像是个网页，但是他里边可以嵌入变量，
        这个东西在node中被称为 模板

    在node中存在有很多个模板引擎，都各具特色，ejs

    ejs是node中的一款模板引擎，使用步骤：
        1.安装ejs
        2.配置express的模板引擎为ejs
            app.set("view engine", "ejs")
        3.配置模板路径
            app.set("views", path.resolve(__dirname, "views"))

        注意，模板引擎需要被express渲染后才能使用
 

    res.render() 用来渲染一个模板引擎，并将其返回给浏览器
    可以将一个对象作为render的第二个参数传递，这样在模板中可以访问到对象中的数据
    res.render("students", { name: "孙悟空", age: 18, gender: "男" })
    <%= %>在ejs中输出内容时，它会自动对字符串中的特殊符号进行转义 &lt;
    这个设计主要是为了避免 xss 攻击
    <%- %> 直接将内容输出
    <% %>  可以在其中直接编写js代码，js代码会在服务器中执行

*/
    res.render("students", { Users: Users })
})
/* 
    第一步获取我们拿到的数据
    第二步让我们的数据添加进我们的数据库中`````
    第三部让我们对页面进行重定向,以防止无限输入上一个表单的内容
    */

app.post("/add-students", (req, res) => {
    // 声明一个id数字,为数组中最后一个对象的id属性的数字+1,来达到我们想要的id数字排序效果
    const id = Users.at(-1).id + 1
    // 结构赋值
    const { name, age, gender, address } = req.body
    // 将获取的各个数值放到一个对象中,age利用隐性迭代转换为Number数值类型
    const newUser = {
        id: id,
        name, age: +age, gender, address
    }
    // 给我们的Users注入我们的要的数据
    Users.push(newUser)
    console.log(newUser);
    fs.writeFile(
        path.resolve(__dirname, "./date/students.json")
        // 将其数据转换为字符串
        , JSON.stringify(Users)
    ).then(() => {
        // 不报错的情况下进行重定向
        res.redirect("/students")
    }
    ).catch(() => { }

    )
    // 重定向
})
app.get("/set_name", (req, res) => {

    name = req.query.name
    res.send("修改成功")
})

//  可以设置一个中间件.来设置所有路由报错后的提醒....让其更加清楚....

app.use((req, res) => {
    res.status(404)
    res.send("<h1>你访问的网站出现问题了........<h1>")
})
app.listen(3000, () => {

    console.log("服务器已启动.....");
})